/* 
 * File:   main.c
 * Author: vagner
 *
 * Created on 10 de Março de 2012, 13:58
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "in_out.h"
#include "SMP.h"


/*Programa que resolve o Problema dos Casamentos Estáveis (SMP)
 * com base no algoritmo de Gale-Shapley. * 
 */
int main(int argc, char** argv) {
    
    char nome_arquivo[50];
    char* linha = NULL;
    int numero_instancias = 1; /*Menor numero possível de instâncias*/
    int numero_individuos = 2; /*Menor numero possível de individuos*/
    int instancias_executadas = 0;
    FILE* arquivo_entrada;
    int i;
    int* lista_preferencia = NULL;
    Homem h = NULL;
    Mulher m = NULL;
        
    Lista lista_homens = cria_lista();
    Lista lista_mulheres  = cria_lista();
    
    /*Validando a sintaxe conforme padrão tp0 -i 'nome do arquivo de entrada'*/
    valida_sintaxe(argc,argv,nome_arquivo);
    
    arquivo_entrada = abre_arquivo(nome_arquivo,"r");
    
    /*Iniciamos lendo a primeira linha do arquivo de entrada para descobrimos
     * o número de instancias do problema.
     */
    linha = le_linha(arquivo_entrada);    
    if((sscanf(linha,"%d",&numero_instancias))!= 1){
        printf("Erro\n");
        exit(-8);
    }
    
    /*Definido o número de instâncias do problema, podemos recuperar
     * o número de individuos para casa instância e descobrir os casamentos 
     * estáveis para estes conjuntos.
     */
    while(instancias_executadas < numero_instancias){
        
        /*Definido o numero de indivíduos de uma determinada instância do
         * problema.
         */
        linha = le_linha(arquivo_entrada);       
        if((sscanf(linha,"%d",&numero_individuos))!= 1){
        printf("Erro em definir numero de inviduos\n");
        exit(-9);
        }
                
        /*Lista de preferência é uma variável auxiliar que armazerá
         * provisóriamente a lista de preferência de um determinado indíviduo.
         * Como o tamamho da lista pode variar, iremos alocar dinamicamente
         * o espaço necessário para armazenar tal informação.
         */
        lista_preferencia = (int*) malloc(numero_individuos*sizeof(int));
        if(lista_preferencia == NULL){
            printf("Erro ao alocar memoria para a lista de preferencia.\n");
            exit(-10);
        }
        
        /*Populando a lista de homens*/
        for(i=0;i<numero_individuos;i++){
            linha = le_linha(arquivo_entrada);
            copia_para_vetor(linha,lista_preferencia,numero_individuos);
            h = cria_pessoa('h',i+1,lista_preferencia,numero_individuos);
            insere_item(&lista_homens,h);          
        }
        
        /*Populando a lista de mulheres*/
        for(i=0;i<numero_individuos;i++){
            linha = le_linha(arquivo_entrada);
            copia_para_vetor(linha,lista_preferencia,numero_individuos);
            m = cria_pessoa('m',i+1,lista_preferencia,numero_individuos);
            insere_item(&lista_mulheres,m); 
        }
                     
        /*Definindo os casamentos estáveis com base na lista de homens e 
         * mulheres e no número de indíviduos em casa lista. O resultado estará
         * no arquivo output.txt
         */
        smp(lista_homens,lista_mulheres,numero_individuos);
        
        remove_todos(&lista_homens);
        remove_todos(&lista_mulheres);
          
        instancias_executadas++;     
    }
    /*Desalocando a memória utilizada.*/
    remove_todos(&lista_homens);
    remove_todos(&lista_mulheres);
    desaloca_pessoa(h);
    desaloca_pessoa(m);
    free(lista_preferencia);
    fecha_arquivo(arquivo_entrada);
    printf("Criado arquivo %s com a saída do programa.\n", OUTFILE);
    return (EXIT_SUCCESS);
}

